package models

// CardBinResponse HlPay获取卡Bin响应
type CardBinResponse struct {
	Code int         `json:"code"`
	Msg  string      `json:"msg"`
	Data CardBinData `json:"data"`
}

// CardBinData 卡Bin数据
type CardBinData struct {
	BinList []CardBinInfo `json:"binList"`
}

// CardBinInfo 卡Bin信息
type CardBinInfo struct {
	CardBinId     string   `json:"cardBinId"`     // 卡Bin ID
	Bin           string   `json:"bin"`           // 卡Bin号
	BinStatus     string   `json:"binStatus"`     // 卡头状态（0:正常 1:冻结）
	OpenCardFee   string   `json:"openCardFee"`   // 开卡手续费
	RechargeFee   string   `json:"rechargeFee"`   // 充值手续费
	RefundFee     string   `json:"refundFee"`     // 退款手续费
	TransFee      *string  `json:"transFee"`      // 交易手续费
	CancelFee     string   `json:"cancelFee"`     // 撤销手续费
	RefuseFee     string   `json:"refuseFee"`     // 拒付手续费
	AuthorizeFee  string   `json:"authorizeFee"`  // 授权手续费
	Remark        string   `json:"remark"`        // 备注
	MinCardAmount int      `json:"minCardAmount"` // 最小开卡金额
	HasHot        string   `json:"hasHot"`        // 是否热门卡（N：不是，Y：是）
	HasNew        string   `json:"hasNew"`        // 是否新卡（N：不是，Y：是）
	Network       string   `json:"network"`       // 卡类型
	Scene         []string `json:"scene"`         // 应用场景
}

// StateResponse HlPay获取州列表响应
type StateResponse struct {
	Code int       `json:"code"`
	Msg  string    `json:"msg"`
	Data StateData `json:"data"`
}

// StateData 州数据
type StateData struct {
	StateVoList []StateInfo `json:"stateVoList"`
}

// StateInfo 州信息
type StateInfo struct {
	ID         string  `json:"id"`         // 州ID
	FullNameEn string  `json:"fullNameEn"` // 英文全名
	FullNameCn string  `json:"fullNameCn"` // 中文全名
	Name       string  `json:"name"`       // 州简称
	Sort       int     `json:"sort"`       // 排序
	Remark     *string `json:"remark"`     // 备注
}

// CardListRequest represents the request parameters for fetching the card list.
type CardListRequest struct {
	CardNo string `form:"cardNo"`
	Name   string `form:"name"`
	Status string `form:"status"`
}

// CardListResponse represents the response for the card list.
type CardListResponse struct {
	Total   int        `json:"total"`
	Rows    []CardItem `json:"rows"`
	Code    int        `json:"code"`
	Message string     `json:"message"`
}

// CardItem represents a single card in the list.
type CardItem struct {
	ID                  string  `json:"id"`
	CardNo              string  `json:"cardNo"`
	FirstName           string  `json:"firstName"`
	LastName            string  `json:"lastName"`
	Status              string  `json:"status"`
	OpenCardStatus      string  `json:"openCardStatus"`
	ActualBalance       string  `json:"actualBalance"`
	Tag                 *string `json:"tag"` // Can be null
	CreateTime          string  `json:"createTime"`
	Bin                 string  `json:"bin"`
	Nickname            string  `json:"nickname,omitempty"`            // 卡片昵称，来自用户数据库
	TotalTransferAmount string  `json:"totalTransferAmount,omitempty"` // 总转账金额，来自用户数据库
}

// CardDetailResponse represents the response for fetching card details.
type CardDetailResponse struct {
	Code int        `json:"code"`
	Msg  string     `json:"msg"`
	Data CardDetail `json:"data"`
}

// CardDetail represents the detailed information of a card.
type CardDetail struct {
	ID             string  `json:"id"`
	Type           string  `json:"type"`
	Bin            string  `json:"bin"`
	CardNo         string  `json:"cardNo"`
	FirstName      string  `json:"firstName"`
	LastName       string  `json:"lastName"`
	CardAddress    string  `json:"cardAddress"`
	City           string  `json:"city"`
	State          string  `json:"state"`
	Zip            string  `json:"zip"`
	PhoneCode      *string `json:"phoneCode"` // Can be null
	Phone          string  `json:"phone"`
	Email          string  `json:"email"`
	CVV            string  `json:"cvv"`
	ExpYear        string  `json:"expYear"`
	ExpMonth       string  `json:"expMonth"`
	Currency       string  `json:"currency"`
	Status         string  `json:"status"`
	CardBinID      string  `json:"cardBinId"`
	Remark         *string `json:"remark"` // Can be null
	CreateTime     string  `json:"createTime"`
	OpenCardFail   *string `json:"openCardFail"` // Can be null
	ActualBalance  string  `json:"actualBalance"`
	Tag            *string `json:"tag"` // Can be null
	OpenCardStatus string  `json:"openCardStatus"`
	FreezeDate     *string `json:"freezeDate"` // Can be null
}

// OpenCardRequest represents the request to open a new card.
type OpenCardRequest struct {
	CardAddress *string `json:"cardAddress,omitempty"`
	Zip         *string `json:"zip,omitempty"`
	LastName    *string `json:"lastName,omitempty"`
	Cost        float64 `json:"cost"`
	City        *string `json:"city,omitempty"`
	Bin         string  `json:"bin"`
	BatchCount  string  `json:"batchCount"`
	FirstName   *string `json:"firstName,omitempty"`
	BillAddress *string `json:"billAddress,omitempty"`
	CardBinID   string  `json:"cardBinId"`
	Phone       *string `json:"phone,omitempty"`
	State       *string `json:"state,omitempty"`
	Email       *string `json:"email,omitempty"`
	Nickname    *string `json:"nickname,omitempty"` // 卡片昵称，仅用于本地逻辑，不传给第三方
}

// ThirdPartyOpenCardRequest 用于传递给第三方API的开卡请求，不包含nickname字段
type ThirdPartyOpenCardRequest struct {
	CardAddress *string `json:"cardAddress,omitempty"`
	Zip         *string `json:"zip,omitempty"`
	LastName    *string `json:"lastName,omitempty"`
	Cost        float64 `json:"cost"`
	City        *string `json:"city,omitempty"`
	Bin         string  `json:"bin"`
	BatchCount  string  `json:"batchCount"`
	FirstName   *string `json:"firstName,omitempty"`
	BillAddress *string `json:"billAddress,omitempty"`
	CardBinID   string  `json:"cardBinId"`
	Phone       *string `json:"phone,omitempty"`
	State       *string `json:"state,omitempty"`
	Email       *string `json:"email,omitempty"`
}

// OpenCardResponse represents the response for opening a card.
type OpenCardResponse struct {
	Code int    `json:"code"`
	Msg  string `json:"msg"`
	Data string `json:"data"` // The card ID
}

// BatchOpenCardRequest is an alias for OpenCardRequest, used for batch opening cards.
// The parameters are the same as the minimal version of a single card opening.
type BatchOpenCardRequest = OpenCardRequest

// BatchOpenCardResponse represents the response for batch opening cards.
type BatchOpenCardResponse struct {
	Code int    `json:"code"`
	Msg  string `json:"msg"`
	Data string `json:"data"` // The batch task ID
}

// RechargeRequest represents the request to recharge a card.
type RechargeRequest struct {
	ID     string  `json:"id"`
	Amount float64 `json:"amount"`
	Remark string  `json:"remark"`
}

// RechargeResponse represents the response for a card recharge.
type RechargeResponse struct {
	Code int         `json:"code"`
	Msg  string      `json:"msg"`
	Data interface{} `json:"data"` // Data is null in the example
}

// WithdrawRequest represents the request to withdraw from a card.
type WithdrawRequest struct {
	ID     string  `json:"id"`
	Amount float64 `json:"amount"`
	Remark string  `json:"remark"`
}

// WithdrawResponse represents the response for a card withdraw.
type WithdrawResponse struct {
	Code int         `json:"code"`
	Msg  string      `json:"msg"`
	Data interface{} `json:"data"` // Data is null in the example
}

// GetCardTaskResponse 查询开卡任务响应
type GetCardTaskResponse struct {
	Code int          `json:"code"`
	Msg  string       `json:"msg"`
	Data CardTaskData `json:"data"`
}

// CardTaskData 开卡任务数据
type CardTaskData struct {
	TaskID   string   `json:"taskId"`   // 任务ID
	Status   string   `json:"status"`   // 任务状态
	Total    int      `json:"total"`    // 总数
	ErrorNum int      `json:"errorNum"` // 错误数量
	ErrorMsg *string  `json:"errorMsg"` // 错误信息
	Data     []string `json:"data"`     // 卡片ID列表
}

// FreezeCardResponse represents the response for freezing a card.
type FreezeCardResponse struct {
	Code int         `json:"code"`
	Msg  string      `json:"msg"`
	Data interface{} `json:"data"` // Data is null in the example
}

// EnableCardResponse represents the response for enabling a card.
type EnableCardResponse struct {
	Code int         `json:"code"`
	Msg  string      `json:"msg"`
	Data interface{} `json:"data"` // Data is null in the example
}

// CancelCardResponse represents the response for cancelling a card.
type CancelCardResponse struct {
	Code int         `json:"code"`
	Msg  string      `json:"msg"`
	Data interface{} `json:"data"` // Data is null in the example
}

// VerificationCodeData represents a single verification code entry.
type VerificationCodeData struct {
	Opt        string `json:"opt"`
	CreateTime string `json:"createTime"`
}

// VerificationCodeResponse represents the response for getting verification codes.
type VerificationCodeResponse struct {
	Code int                    `json:"code"`
	Msg  string                 `json:"msg"`
	Data []VerificationCodeData `json:"data"`
}

// CardHistoryListRequest 卡历史列表查询请求
type CardHistoryListRequest struct {
	PageIndex      int64  `json:"pageIndex"`      // 页码
	PageSize       int64  `json:"pageSize"`       // 每页大小
	CardID         string `json:"cardId"`         // 卡ID
	CardFormFactor string `json:"cardFormFactor"` // 卡形态
	Status         string `json:"status"`         // 状态
	FeeType        string `json:"feeType"`        // 费用类型
	CreatedAtStart string `json:"createdAtStart"` // 创建开始时间
	CreatedAtEnd   string `json:"createdAtEnd"`   // 创建结束时间
}

// CardHistoryInfo 卡历史信息
type CardHistoryInfo struct {
	ActualFeeAmount   string `json:"actualFeeAmount"`   // 实际费用金额
	ActualFeeCurrency string `json:"actualFeeCurrency"` // 实际费用币种
	CardID            string `json:"cardId"`            // 卡ID
	CardScheme        string `json:"cardScheme"`        // 卡组织
	CardType          string `json:"cardType"`          // 卡类型
	CreatedAt         string `json:"createdAt"`         // 创建时间
	FeeType           string `json:"feeType"`           // 费用类型
	MaskCardNo        string `json:"maskCardNo"`        // 掩码卡号
	MemberID          string `json:"memberId"`          // 会员ID
	MatrixAccount     string `json:"matrixAccount"`     // 矩阵账户
	Nickname          string `json:"nickname"`          // 用户昵称
	ReferenceNo       string `json:"referenceNo"`       // 参考号
	Status            string `json:"status"`            // 状态
	CardFormFactor    string `json:"cardFormFactor"`    // 卡形态
	CardNickname      string `json:"cardNickname"`      // 卡昵称
}

// CardHistoryListResponse 卡历史列表查询响应
type CardHistoryListResponse struct {
	BaseResponse
	PageIndex int64             `json:"pageIndex"` // 页码
	PageSize  int64             `json:"pageSize"`  // 每页大小
	Total     int64             `json:"total"`     // 总数
	Data      []CardHistoryInfo `json:"data"`      // 数据列表
}

// BaseResponse 基础响应结构
type BaseResponse struct {
	Code string `json:"code"` // 响应码
	Msg  string `json:"msg"`  // 响应消息
}

// TODO: 后续可以在这里添加其他卡相关的模型
// 例如：开卡请求、卡片列表响应、卡片详情等
